#include <iostream>
using namespace std;
#include <list>

//list 双向链表容器 可高效地进行插入删除元素
//list不可随机存取元素,所以不支持at(pos) 函数与 []操作府 
        //list的迭代器可以it++ 但是不能加一个数值it+5(err)

//list基本操作
void test1()
{
        list<int> l;
        for (int i = 0; i < 10; i++)
        {
                l.push_back(i+1); //尾部插入元素 尾插法
        }
        cout<<"list的大小: "<<l.size()<<endl;
        
        list<int>::iterator it = l.begin();
        while (it != l.end())
        {
                cout<<*it<<" ";
                it++;
        }
        cout<<endl;

        //list不能随机访问
        //1    2   3    4   5    6
        //🕒
        //                  🕒
        it = l.begin();
        it++;
        it++;
        it++;
        //it+5;//报错 不支持随机的访问容器
        //it经过三次已经到了元素4的位置了
        l.insert(it, 100); //请问100插入在什么位置? 发现100插入在元素4的前面
        for (list<int>::iterator it = l.begin(); it !=  l.end(); it++)
        {
                cout<<*it<<" ";
        }
        cout<<endl;
        //结论1：链表的结点index 序号是从0号位置开始的
        //                      在3号位置插入元素, 让原来的3号位置变成4号位置 原来的4号位置变成5号位置
}

//list 删除
void test2()
{
        list<int> l;
        for (int i = 0; i < 10; i++)
        {
                l.push_back(i+1); //尾部插入元素 尾插法
        }
        cout<<"list的大小: "<<l.size()<<endl;
        for (list<int>::iterator it = l.begin(); it !=  l.end(); it++)
        {
                cout<<*it<<" ";
        }
        cout<<endl;
        
        list<int>::iterator it1 = l.begin();
        list<int>::iterator it2 = l.begin();
        it2++;
        it2++;
        it2++;
        l.erase(it1, it2); //左闭右开

        for (list<int>::iterator it = l.begin(); it !=  l.end(); it++)
        {
                cout<<*it<<" ";
        }
        cout<<endl;

        l.insert(l.begin(), 100);
        l.insert(l.begin(), 100);
        l.insert(l.begin(), 100);
        for (list<int>::iterator it = l.begin(); it !=  l.end(); it++)
        {
                cout<<*it<<" ";
        }
        cout<<endl;

        l.erase(l.begin());
        for (list<int>::iterator it = l.begin(); it !=  l.end(); it++)
        {
                cout<<*it<<" ";
        }
        cout<<endl;     

        l.remove(100);
        for (list<int>::iterator it = l.begin(); it !=  l.end(); it++)
        {
                cout<<*it<<" ";
        }
        cout<<endl;
}

int main(int argc, char const *argv[])
{
        //test1();
        test2();
        return 0;
}
